#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "io.h"
#include "seamcarving.h"
#include "ppm.h"

int IntensidadePixel(int red, int green, int blue)
{
	return (int)((0.30 * red) + (0.59 * green) + (0.11 * blue));
}

void CalcIntensidadeLuminosa(Imagem *imagem, int **intensidadeLuminosa)
{
	int i, j;
	for(i=0; i<imagem->numLinhas; i++)
	{
		for(j=0; j<imagem->numColunas; j++)
		{
			intensidadeLuminosa[i][j] = IntensidadePixel(imagem->imagem[i][j].pixelRED, imagem->imagem[i][j].pixelGREEN, imagem->imagem[i][j].pixelBLUE);
		}
	}
}

unsigned char EnergiaPixel(int **intensidade, int x, int y, int numLinhas, int numColunas)
{
	short int Gx;
	short int Gy;

	unsigned char a,b,c,d,e,f,g,h,i;

	if(x == 0 && y == 0)//se o prixel esta na quina superior esquerda
	{
		a = intensidade[x][y];
		b = intensidade[x][y+1];	//copia dos pixels da borda superior
		c = intensidade[x][y+2];

		d = intensidade[x+1][y];
		g = intensidade[x+2][y];	//copia dos pixels da borda esquerda

		e = intensidade[x][y];
		h = intensidade[x][y+1];
		f = intensidade[x][y+1];
		i = intensidade[x+1][y+1];

	}
	else if(x == 0 && y < numColunas-1) //se o prixel esta na borda superior
	{
		a = intensidade[x][y-1];
		b = intensidade[x][y];			//copia dos pixels da borda superior
		c = intensidade[x][y+1];

		d = a;
		e = b;									//linha do meio é igual a copia da linha superior
		f = c;

		g = intensidade[x+1][y-1];
		h = intensidade[x+1][y];		//ultima linha é igual a linha original do meio
		i = intensidade[x+1][y+1];

	}
	else if(x == 0 && y == numColunas-1) //se o prixel esta na quina superior direita
	{
		c = intensidade[x][y];
		b = intensidade[x][y-1];		//copia dos pixels da borda superior
		a = intensidade[x][y-2];

		f = intensidade[x+1][y];
		i = intensidade[x+2][y];		//copia da borda direita

		e = intensidade[x][y];
		d = intensidade[x][y-1];
		h = intensidade[x+1][y];
		g = intensidade[x+1][y-1];

	}
	else if(y == 0 && x < numLinhas-1) //se o pixel esta na borda esquerda
	{
		a = intensidade[x-1][y];
		d = intensidade[x][y];			//cópia dos pixels da borda esquerda
		g = intensidade[x+1][y];

		b = a;
		e = d;
		h = g;

		c = intensidade[x-1][y+1];
		f = intensidade[x][y+1];
		i = intensidade[x+1][y+1];

	}
	else if(y == 0 && x == numLinhas-1) //se o pixel esta na quina inferior esquerda
	{
		g = intensidade[x][y];
		d = intensidade[x-1][y];	//copia dos pixels da borda esquerda
		a = intensidade[x-2][y];

		h = intensidade[x][y+1];	//copia dos pixels da borda inferior
		i = intensidade[x][y+2];

		e = intensidade[x][y];
		b = intensidade[x-1][y];
		f = intensidade[x][y+1];
		c = intensidade[x-1][y+1];

	}
	else if(y == numColunas-1 && x < numLinhas-1 ) //se o pixel esta na borda direita
	{
		c = intensidade[x-1][y];
		f = intensidade[x][y];			//copia dos pixels da borda direita
		i = intensidade[x+1][y];

		b = c;
		e = f;
		h = i;

		a = intensidade[x-1][y-1];
		d = intensidade[x][y-1];
		g = intensidade[x+1][y-1];

	}
	else if(x == numLinhas-1 && y < numColunas-1) //se o pixel esta na borda inferior
	{
		g = intensidade[x][y-1];
		h = intensidade[x][y];		//copia dos pixels da borda inferior
		i = intensidade[x][y+1];

		d = g;
		e = h;
		f = i;

		a = intensidade[x-1][y-1];
		b = intensidade[x-1][y];
		c = intensidade[x-1][y+1];

	}
	else if(x == numLinhas-1 && y == numColunas-1) // se o pixel esta na quina inferior direita
	{
		i = intensidade[x][y];
		f = intensidade[x-1][y];	//copia dos pixels da borda direita
		c = intensidade[x-2][y];

		h = intensidade[x][y-1];	//copia dos pixels da borda inferior
		g = intensidade[x][y-2];

		e = intensidade[x][y];
		d = intensidade[x][y-1];
		b = intensidade[x-1][y];
		a = intensidade[x-1][y-1];
	}
	else //finalmente se o pixel esta em um ponto interno da intensidade
	{
		a = intensidade[x-1][y-1];
		b = intensidade[x-1][y];
		c = intensidade[x-1][y+1];
		d = intensidade[x][y-1];
		e = intensidade[x][y];
		f = intensidade[x][y+1];
		g = intensidade[x+1][y-1];
		h = intensidade[x+1][y];
		i = intensidade[x+1][y+1];
	}

	Gx = ((c+(2*f)+i)-(a+(2*d)+g));
	Gy = ((g+(2*h)+i)-(a+(2*b)+c));

	return sqrt((pow(Gx,2)) + (pow(Gy,2)));;

}

void FiltroSobel(Imagem *imagem, int **matrizIntensidade, int numLinhas, int numColunas)
{
	int i, j;
	for(i=0; i<numLinhas; i++)
	{
		for(j=0; j<numColunas; j++)
		{
			imagem->imagem[i][j].energia = (int)EnergiaPixel(matrizIntensidade, i, j, numLinhas, numColunas);
		}
	}
}

